Java多线程(十二) Java中sleep和yield的区别

您所在的位置:网站首页 java 当前线程sleep Java多线程(十二) Java中sleep和yield的区别

Java多线程(十二) Java中sleep和yield的区别

#Java多线程(十二) Java中sleep和yield的区别| 来源: 网络整理| 查看: 265

一、前言

昨天大学时宿舍的舍长突然联系,说已经回到大学母校了,说是看望老师。

提到以后有时间大家一起回母校聚一聚。

时光荏苒,光阴似箭。我已人到中年,这些年我总会偶尔想起我的一位大学舍友。

亮仔,大家都这么叫他,他在我对面的床,个子不高,比较瘦,脸很白,再配上天然的卷发。

毕业后,没怎么联系过,有一天看到他QQ发了说说,大概是得了什么病,他自己也很奇怪。

我问他怎么了,他只是简单的说得了肠道上的病,已经躺床上好久了。

后来我也没问过,突然有一天,宿舍里和亮仔同乡的舍友发消息说亮仔已经走了。

很惊讶这么突然,也很遗憾在他生病期间,我没去南通看望过他。

大学里经常和他一起玩魔兽争霸的dota地图,火炬之光,和他一起追《权利的游戏》。

可大学毕业后,极少联系。

舍长说有空再聚一聚,微信群里没人回应。我没回应是因为亮仔,我怕相聚后谈起这件事。

想想自己吧,不知道明天和意外哪个会先来。

好了,活着的人是幸运的,生活还得继续,下班回家有可爱的家人相伴。

还想着好好学习Java多线程,并换个工资高一点的工作,改善家里的经济情况。

一句话总结:和故人比,现在的每一天都多么奢侈,珍惜当天,不要虚度。

二、Thread Sleep方法 调用sleep会让当前线程从Running进入Timed Waiting(也是阻塞状态)sleep方法要设置睡眠的时间,当时间到了,线程未必立即执行,线程会变成就绪状态,等待CPU时间片其它线程可以使用interrupt方法打断正在sleep的线程,被打断的线程抛出InterruptedException 1. 测试sleep后,线程状态进入Timed Waiting public class Thread02_Sleep { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread("t1") { @Override public void run() { try { System.out.println("子线程开始Sleep"); Thread.sleep(3000); System.out.println("子线程结束Sleep"); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.start(); System.out.println("子线程的状态" + t1.getState()); Thread.sleep(1000);//这个是主线程的sleep,而不是子线程,为了延时获取到子线程阻塞状态 System.out.println("子线程的状态" + t1.getState()); } }

运行结果如下:

子线程的状态RUNNABLE 子线程开始Sleep 子线程的状态TIMED_WAITING 子线程结束Sleep 2. 测试interrupt方法打断sleep中的线程 public class Thread03_Sleep_Interruped { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread("t1") { @Override public void run() { try { System.out.println("子线程开始Sleep"); Thread.sleep(3000); System.out.println("子线程结束Sleep"); } catch (InterruptedException e) { System.out.println("该线程被interrupt了"); e.printStackTrace(); } } }; t1.start(); Thread.sleep(1000); System.out.println("开始interrupt"); t1.interrupt(); } } 子线程开始Sleep 开始interrupt 该线程被interrupt了 java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at study.test00_java.thread02_method.Thread03_Sleep_Interruped$1.run(Thread03_Sleep_Interruped.java:14) 3. 使用TimeUnit优化代码可读性

Thread.sleep()方法参数填的是毫秒数,如果是35秒,得Thread.sleep(35000)。

这样时间需要经过换算,可读性不高。

可以使用TimeUnit优化代码可读性。

Thread.sleep(35000); TimeUnit优化可读性 TimeUnit.SECONDS.sleep(35); 三、Thread的yield和sleep的区别 调用yield会让线程从Running进入Runnable就绪状态,而sleep方法是进入Timed Waiting阻塞所以yield后,线程进入就绪状态,有可能立马又被CPU执行,而sleep会让线程阻塞指定的时间yield方法只会给相同优先级或者更高优先级线程运行的机会,而sleep方法不考虑线程优先级yield方法没有声明任何异常,而sleep方法声明抛出InterruptedExceptionyield具体的实现依赖操作系统的任务调度器yield和sleep的共同点:它们都是Thread 类的方法,不会释放资源锁


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3